<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
</head>
<body>
    <script >
       /*
        ES6
        引入了一种新的原始数据类型 Symbol，表示
        独一无法的值，它是JavaScript语言的第七种数据类型
        ，是一种类类似于字符串的数据类型
        Symbol 特点
        - Symbol 的值是唯一的，用来解决命名冲突的问题
        - Symbol 值不能与其他的数据进行运算
        - Symbol 定义的对象属性不能使用 for...in 循环遍历
          但是可以使用 Reflect.ownKeys 来获取对象的所有键名
       */

       // 创建Symbol
       let s = Symbol();
       console.log(s,typeof s);
      
      // 你可以传入任意的字符串来构造出一个Symbol
      // 但是这个字符串也只是一个字符串，即便你传入
      // 了两个完全相同的字符串来构造Symbol他们本质是不一样的
      let s2 = Symbol('pop');
      let s3 = Symbol('pop');
      console.log(s2 === s3);// false

      // 但是你使用 for方法就可以构造出相同的
      let s4 = Symbol.for('pop');
      let s5 = Symbol.for('pop');
      console.log(s4 === s5);// true

      // 不能与其他的数据进行运算
      let r = s + 100;//error
      let r1 = s > 100;// error
      let r2 = s + s;//error

      // 记住几大基本类型
      // USONB u are so niubility
      /*
         u undefined
         s string symbol
         o object
         n number null
         b boolean
      */

      // symbol 的练习
      // symbol的使用是为了给对象添加独一无二的属性

      // 之前我们知道 通过构造方法，我们即便传入相同的字符串，得到的结果也是不一样的
      let obj1  ={name:'obj'};
      let method = {
        down:Symbol(),
        up:Symbol()
      }
      //这样我们可以添加这些,因为Symbol可以产生一些第一无二的值
      obj1[method.down] = function(){

      }
      obj1[method.up] = function(){

      }

      // 
      let yx = {
        name:"狼人杀",
        [Symbol('say')]:function(){},
        [Symbol('ziao')]:function(){}
      }

    </script>
</body>

</html>